package com.cskaoyan.javase._1extends._7initialization._3super;

/**
 * super关键字
 * this指向当前子类对象,super指向子类对象中的父类成员区域
 * 所以,super关键字可以近似的看成指向一个父类对象
 *
 * this指向当前子类对象
 * super(近似)指向这个子类的父类对象(实际上指向的是子类对象中父类成员的区域)
 *
 * super和this在使用上非常相似,区别在于一个指向子类,一个指向父类.
 * this和super需要在一个子类的成员方法,构造器,构造代码块这些结构中使用.
 *
 * 区别:
 *      1.(核心区别) this就是一个引用,就是指向子类对象
 *          但super不是一个引用,它并不是真的指向父类对象,而是指向子类对象中的一片父类区域
 *      2.this毕竟指向子类自身对象,this是在自身类中使用,指向自己
 *          既然是自己人,肯定不受权限限制
 *          但super毕竟指向的是父类,不是自己人,所以受权限限制
 *
 *
 * @since 16:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        s.testSon();
    }
}

class Father {
    int a = 10;
    int c = 30;
    private int d;

    public void testFather() {
    }

    public Father() {
    }
}

class Son extends Father {
    int b = 20;
    int c = 300;
    private int d;

    public Son() {

    }

    {
        // 构造器代码块相当于new对象过程中,自动被调用的成员方法
        // 所以构造代码块中,this和super的使用,和成员方法一致
    }
    public Son(int b, int c) {
        // this在构造器中有特殊的用途: 可以表示调用子类自身的构造器
        // this();
        // super也有类似的作用,但是它表示调用父类的构造器
        // super();
        this.b = b;
        this.c = c;
    }

    public void testSon() {
        // 以下两个a都是指继承自父类的a
        System.out.println(this.a);
        System.out.println(super.a);
        // 独属于子类的b,只能用this访问
        // super.b
        System.out.println(this.b);
        // 当父子类出现同名成员时,super和this就分别指向各自的同名成员
        System.out.println(super.c);
        System.out.println(this.c);

        System.out.println(this);
        // this是引用可以输出,但super不是,不能输出
        // System.out.println(super);

        System.out.println(this.d);
        // 'd' has private access in 'com.cskaoyan.javase._1extends._7initialization._3super.Father'
        // super.d;
    }
}
